/**
 * 创建一个 debounced（防抖动）函数，该函数会从上一次被调用后，延迟 wait 毫秒后调用 func 方法。 
 * debounced（防抖动）函数提供一个 cancel 方法取消延迟的函数调用以及 flush 方法立即调用。 
 * @param func - 需要防抖处理的函数。
 * @param wait - 需要延迟的毫秒数。
 * @returns 返回新的 debounced（防抖动）函数。
 */
export function debounce(
    func: Function,
    wait: number
  ): Function {
    let timeoutId: ReturnType<typeof setTimeout> | null = null;
    let lastArgs: any[];
    let lastThis: any;
  
    // 清除定时器
    function clearTimer() {
      if (timeoutId) {
        clearTimeout(timeoutId);
        timeoutId = null;
      }
    }
  
    // 延迟执行函数
    function delayed() {
      clearTimer();
      func.apply(lastThis, lastArgs);
    }
  
    // 返回的防抖函数
    function debounced(this: any, ...args: any[]) {
      lastArgs = args;
      lastThis = this;
  
      clearTimer();
      timeoutId = setTimeout(delayed, wait);
    }
  
    // 添加取消方法
    debounced.cancel = function() {
      clearTimer();
    };
  
    return debounced;
}